﻿<?php
// //require_once('../../config.php');
// global $CFG;
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->libdir . '/accesslib.php'); //dùng hàm has_capability
require_once($CFG->dirroot . '/lib/moodlelib.php');	//Sử dụng hàm getdate để lấy dữ liệu ngày tháng
require_once($CFG->dirroot.'/course/lib.php');			//Sử dụng hàm create_course để mở course

/* Tao menu cho plugin */
function myplugin_extends_navigation(global_navigation $navigation) {
	$nodeCDIO 		= $navigation->add('CDIO');
	
	/******************************************************************************************
	*						CURRICULUM MANAGEMENT
	******************************************************************************************/
	$test = $nodeCDIO->add('test',new moodle_url($CFG->wwwroot.'/local/myplugin/curriculum/test.php'));
	if(has_capability('local/myplugin:managecurriculum', context_system::instance())) {
		$nodeCurr 		= $nodeCDIO->add('Curriculum');
		$nodeProgram		= $nodeCurr->add('Program', new moodle_url($CFG->wwwroot.'/local/myplugin/curriculum/add_program.php'));
		$nodeMajor 		= $nodeCurr->add('Major', new moodle_url($CFG->wwwroot.'/local/myplugin/curriculum/add_major.php'));
		$nodeSubject = $nodeCurr->add('Subject');
		$nodeManageSubject 	= $nodeSubject->add('Manage', new moodle_url($CFG->wwwroot.'/local/myplugin/curriculum/add_subject.php'));
		$nodeImportSubject 	= $nodeSubject->add('Import', new moodle_url($CFG->wwwroot.'/local/myplugin/curriculum/import_subject.php'));
		$nodeBlock 		= $nodeCurr->add('Block', new moodle_url($CFG->wwwroot.'/local/myplugin/curriculum/add_bok.php'));
	}
	
	if(has_capability('local/myplugin:viewcurriculum', context_system::instance())) {
		$nodeViewCurriculum 		= $nodeCDIO->add('View Curriculum', new moodle_url($CFG->wwwroot.'/local/myplugin/curriculum/view_curriculum.php'));
	}
	/******************************************************************************************
	*						LEARNING OUTCOMES MANAGEMENT
	******************************************************************************************/
	if(has_capability('local/myplugin:managelearningoutcomes', context_system::instance())) {	
		$nodeLO 	= $nodeCDIO->add('Learning Outcomes');
		 $nodeaddlo = $nodeLO->add('Import', new moodle_url($CFG->wwwroot.'/local/myplugin/lo/import_lo.php'));
		$nodeaddlo 		= $nodeLO->add('Manage', new moodle_url($CFG->wwwroot.'/local/myplugin/lo/index.php'));
	}
	/******************************************************************************************
	*						SYLLABUS MANAGEMENT
	******************************************************************************************/
	if(has_capability('local/myplugin:managesyllabus', context_system::instance())) {	
		$nodeSyll 	= $nodeCDIO->add('Syllabus  Management');
	}
	/******************************************************************************************
	*						COURSE GENERATION
	******************************************************************************************/
	if(has_capability('local/myplugin:managecourses', context_system::instance())) {	
		$nodeCourseGenerate 	= $nodeCDIO->add('Course Generation', new moodle_url($CFG->wwwroot.'/local/myplugin/curriculum/generate_course.php'));
	}
	
	$nodeCDIO->forceopen = true;
	$nodeCurr->forceopen = true;
	// $nodecreatecurr->forceopen = true;
	$nodeCurr->forceopen = true;
	$nodeLO->forceopen = true;
}

define('ADD_PROGRAM_SUCCESSFUL', "Chương trình mới vừa được thêm!");
define('ADD_MAJOR_SUCCESSFUL', "Ngành mới vừa được thêm!");
define('ADD_SUBJECT_SUCCESSFUL', "Môn học mới vừa được thêm!");
define('ADD_BLOCK_SUCCESSFUL', "Khối kiến thức mới vừa được thêm!");
define('IMPORT_SUBJECT_SUCCESSFUL', "Danh sách môn học vừa được thêm");
define('PROGRAM_NOT_SELECT', "Xin vui lòng chọn một chương trình đào tạo!");
define('IMPORT_LO_SUCCESSFUL', "Danh sách các chuẩn đầu ra vừa được thêm");

/********************************************************************************************
 * 									CURRICULUM MODULE
 *******************************************************************************************/ 
class curriculum_management 
{
    public function add_program($program_obj) 
    {
		 global $DB;
    	 if($DB->insert_record('program', $program_obj)) {
			return true;
		 }
		 return false;
    }
	
   //add_subject
    public function add_teacher_subject($n,$subject_id, $teacher_id,$role)
	{
        global $DB;
        $result = array();
 
        
        for($i=0;$i<$n;$i++)
        {
        
        $record = array();
        $result[$i] = str_replace(",","",$teacher_id[$i]);
        $record['teacher']= $result[$i];

        $record['subject']= $subject_id;
       
        $record['role']= $role;

        
    	$DB->insert_record('teacher_subject', $record);
        }

	}
    //update
      
	/*
	 * Thêm một block mới vào CSDL cho một chương trình đào tạo hoặc cho một ngành
	 */
	public function add_block_knowledge($block_obj, $program, $majors, $subjects) 
    {
		try 
		{
			global $DB;
			$transaction = $DB->start_delegated_transaction();
			$n_major = count($majors);					//Số lượng chuyên ngành dc chọn để áp dụng khối kiến thức
			if($n_major == 0) {							//Block áp dụng cho chương trình đào tạo
				$block_obj['program_id'] = $program;		//Thêm id của program mà block thuộc về
			}
			//Lưu dữ liệu vào bảng block_of_knowledge trước
			$DB->insert_record('block_of_knowledge', $block_obj);	
			
			//lấy id của block vừa thêm để có dữ liệu thêm vào các bảng có liên quan
			$sql = 'SELECT * FROM mdl_block_of_knowledge  where id in (SELECT max(id) as id FROM `mdl_block_of_knowledge`) ;';	
			$block = $DB->get_record_sql($sql);
			
			//Nếu block áp dụng cho 1 hoặc nhiều chuyên ngành thì thêm thông tin vào major_block
			if($n_major>0)  {
				for($i = 0; $i<$n_major; $i++) {
					$major_block = array();
					$major_block['id'] = '';
					$major_block['major_id'] = $majors[$i];
					$major_block['blockofknowledge_id']= $block->id;
					$DB->insert_record('major_block', $major_block);
				}
			}
			//Lưu subject_block
			$subject_block = array();
			foreach($subjects as $s) {
				$subject_block['id']= '';
				$subject_block['subject_id'] = $s;
				$subject_block['blockofknowledge_id'] = $block->id;
				$DB->insert_record('subject_block', $subject_block);
			}
			$transaction->allow_commit();
			return true;
		} 
		catch (Exception $e) 
		{
			$transaction->rollback($e);
			return false;
		}
	}	
	
	public function update_block_knowledge($blockid, $program, $majors, $subjects)
	{
		echo "<h1>Subjects : ".count($subjects)."</h1>";
		global $DB;
		
		//Update 
		//Xóa các môn học cũ
		$DB->delete_records('subject_block', array('blockofknowledge_id'=>$blockid));
		
		//Lưu môn học mới
		$subject_block = array();
		foreach($subjects as $s) {
			$subject_block['id']= '';
			$subject_block['subject_id'] = $s;
			$subject_block['blockofknowledge_id'] = $blockid;
			$DB->insert_record('subject_block', $subject_block);
		}
		
		//Xóa các majors cũ
		$DB->delete_records('major_block', array('blockofknowledge_id'=>$blockid));
		
		//Lưu major mới
		$major_block = array();
		foreach($majors as $m) {
			$major_block['id'] = '';
			$major_block['major_id'] = $m;
			$major_block['blockofknowledge_id']= $blockid;
			$DB->insert_record('major_block', $major_block);
		}
	}	
	
	/**
	 * Thêm một môn học mới vào CSDL
	 */ 
	public function add_subject($subject_obj)
	{
		global $DB;
    	$id_subject = $DB->insert_record('subject', $subject_obj,$returnid=true);
	return $id_subject;

	}
	
	/**
	 * Thêm một môn học mới vào CSDL, danh mục môn học được lấy từ file excel
	 */ 
	public function import_subject($subject_obj)
	{
		global $DB;
        $temp = NULL;
    	$temp = $DB->insert_record('subject', $subject_obj,$returnid=true);
		return $temp;

	}
    public function import_teacher($record)
    {
  	     global $DB;
    	 $DB->insert_record('teacher_subject', $record);

    }
	public function add_program_major($program_major) 
    {
		global $DB;
		 if($DB->insert_record('program_major', $program_major))
		 {
			return true;
			
		}
		else
		{
			return false;
		}
		 
    }
	
	public function add_major($major_info) 
	{
		global $DB;
		if($DB->insert_record('major', $major_info)) {
			return true;
		}
		return false;
	}
	
	//them subject vào khối kiến thức (bảng mdl_subject_major) 
	public function add_pro_bok_desc($pro_bok_desc) 
    {
		global $DB;
		$DB->insert_record('program_block_desc', $pro_bok_desc);
    }
	
	public function update_pro_bok_desc($pro_bok_desc) 
    {
		global $DB;
		$DB->update_record('program_block_desc', $pro_bok_desc);
    }
	
	public function add_subject_major($pro_bok_desc) 
    {
		global $DB;
		$DB->insert_record('subject_major', $pro_bok_desc);
    }
	
	public function get_curriculum_structure($program_id)
		{	
			global $DB;
			$options = array("not"=>"Các khối kiến thức");
			//Lấy danh sách các khối kiến thức chung
			$blocks = $DB->get_records('block_of_knowledge', array('program_id'=>$program_id));
			
			foreach ($blocks as $b){
				$options[$b->id] = $b->bok_name; 
			}
			//Lấy danh sách các chuyên ngành
			$majors = $DB->get_records('major', array('program_id'=>$program_id));
			foreach ($majors as $m) {
				//Ứng với mỗi chuyên ngành liệt kê các khối kiến thức của từng chuyên ngành
				$sql = "SELECT mdl_block_of_knowledge.id, mdl_block_of_knowledge.bok_name ".
						" FROM mdl_block_of_knowledge inner join mdl_major_block on mdl_block_of_knowledge.id = mdl_major_block.blockofknowledge_id ".
						" WHERE mdl_major_block.major_id = ".$m->id;		
				$block_major = $DB->get_records_sql($sql);
				
				
				foreach ($block_major as $b) {
					$options[$b->id] = $b->bok_name; 
				}
			}
			
			return $options;
		}
	
	
//======================================EDIT INFORMATION AREA =========================
		
	public function update_subject($subject_info) 
	{
		global $DB;
		if($DB->update_record('subject', $subject_info)) {
			return true;
		}
		return false;
	}
	
	public function update_major($major_info) 
	{
		global $DB;
		$DB->update_record('major', $major_info);
	}
	
	public function update_program($program_info) 
	{
		global $DB;
		$DB->update_record('program', $program_info);
	}
//===================================DELETE DATA ==========================================
	public function delete_block($block_id)
	{
		global $DB;
		//Xóa các record liên quan đến $block trong table block_subject
		$DB->delete_records('subject_block', array('blockofknowledge_id'=>$block_id));
		//Xóa các record liên quan đến $block trong table block_major
		$DB->delete_records('major_block', array('blockofknowledge_id'=>$block_id));
		//Xóa record $block trong table block_of_knowledge
		$DB->delete_records('block_of_knowledge', array('id'=>$block_id));
		
	}
	
	public function delete_subject($subject_id)
	{
		global $DB;
		//Xóa các record liên quan đến $subject trong table block_subject
	 $subjectsarray = $DB->get_records('subject',array('id'=>$subject_id));
        foreach($subjectsarray as $subjectarray)
        $DB->delete_records('teacher_subject',array('subject'=>$subjectarray->id));
		$DB->delete_records('subject_block', array('subject_id'=>$subject_id));
		//Xóa record subject trong table subject
		$DB->delete_records('subject', array('id'=>$subject_id));
		
	}
	
	public function delete_major($major_id)
	{
		global $DB;
		//Tìm những block chỉ thuộc về major này
		$sql = 'SELECT * '.
				' FROM mdl_block_of_knowledge inner join mdl_major_block on mdl_block_of_knowledge.id = mdl_major_block.blockofknowledge_id '.
				' WHERE mdl_major_block.major_id = '.$major_id.
				' AND mdl_block_of_knowledge.id NOT IN '.
				' ( SELECT mdl_major_block.blockofknowledge_id FROM mdl_major_block WHERE mdl_major_block.major_id <> '.$major_id.')';
		$blocks = $DB->get_records_sql($sql);		
		//Xóa thông tin subject_block của các block chỉ thuộc về major này
		$n = count($blocks);
		if(count > 0) {
			foreach($blocks as $b) {
				$DB->delete_records('subject_block', array('blockofknowledge_id'=>$b->blockofknowledge_id));
			}
			
			//Xóa các block chỉ thuộc về major này
			foreach($blocks as $b) {
				$DB->delete_records('block_of_knowledge', array('id'=>$b->blockofknowledge_id));
			}
		}
		// Xóa các record liên quan đến $major trong table major_block
			$DB->delete_records('major_block', array('major_id'=>$major_id));
		
		// Xóa record major trong table major
		$DB->delete_records('major', array('id'=>$major_id));
	}
	
	public function delete_program($program_id) 
	{
		global $DB;
		//Hiện tại hàm chỉ cho xóa các program rỗng
		
		//Kiểm tra xem program này có danh mục môn học chưa
		$subjects = $DB->get_records('subject', array('program_id' =>$program_id));
		
		//Kiểm tra xem program này có danh mục chuyên ngành chưa
		$majors = $DB->get_records('major',array('program_id' => $program_id));
		
		//Kiểm tra xem program này có các block liên quan chưa
		$blocks = $DB->get_records('block_of_knowledge', array('program_id'=>$program_id));
		
		if(($subjects == null) && ($majors == null) && ($blocks == null)) {
			$DB->delete_records('program', array('id'=>$program_id));
		}
	}
	
	/**
	 * Mở course mới cho một subject
	 */ 
	public function open_course($program_id, $subject_id, $startdate)
	{
		global $DB;
		//Tạo chuỗi ngày mở course
		//$startdate 	= mktime(0,0,0, $month, $day, $year);
		
		$str = ' Subject: '.$subject_id.' - Program: '.$program_id. ' - Date: '.$startdate;
		
		//Lấy dữ liệu môn học và chương trình đào tạo
		$subject = $DB->get_record('subject', array('id'=>$subject_id));
		$program = $DB->get_record('program', array('id'=>$program_id));

		//Tìm trong CSDL xem category đã có sẵn chưa
		$existing_category = $program->program_name.' - Hệ '.$program->program_type;

		$isExist = $DB->get_records('course_categories', array('name'=>$existing_category));

		//Tạo category mới - category chính là chương trình đào tạo
		if($isExist == null) {	//Nếu chưa có category thì tạo mới
			$category->name 		= $program->program_name.' - Hệ '.$program->program_type;
			$category->description 	= $program->program_description;
			$DB->insert_record('course_categories', $category);

			//lấy id của category vừa thêm để có dữ liệu thêm vào các bảng có liên quan
			$sql = 'SELECT * FROM mdl_course_categories  where id in (SELECT max(id) as id FROM mdl_course_categories)';	
			$category = $DB->get_record_sql($sql);
		}
		else {
			$category = $DB->get_record('course_categories', array('name'=>$existing_category)); // Lấy category 
		}

		//Tạo course mới
		$course->category	 	= $category->id;
		$course->fullname 		= $subject->subject_name_vn;
		$course->shortname 		= $subject->subject_id;
		$course->idnumber 		= $subject->subject_id;
		$course->summary		= $subject->abstract;
		$course->format			= "weeks";			
		$course->numsections	= 10;				// số tuần/topic trong khóa học
		$course->startdate		= $startdate;
		create_course($course);

		echo $str;
	}
} 


/********************************************************************************************
 * 									LEARNING OUTCOME MODULE
 *******************************************************************************************/ 
class learning_outcome_management
{
	public function add_new_lo($lo)
	{
		global $DB;
		$DB->insert_record('learning_outcome', $lo);
	}
}
?>
